package kgame5.enginex.part {
import kgame5.enginex.ISenceWorld;
import kgame5.enginex.comp.fsm.FSM;
import kgame5.kgu.spacial.SpacialManager;

import flash.utils.Dictionary;

/**
 * @author kk
 */
public class GFSMBatch {
	//保持各个fsm用来遍历用,并行状态机
	private var dict_fsm:Dictionary;//dict_fsm[fsmID]=FSM
	
	public function GFSMBatch(){
		dict_fsm=new Dictionary();
	}
	
	//更新各个fsm
	public function update():void{
		for each(var fsm:FSM in dict_fsm){
			fsm.update();
		}
	}
	
	//设置到各个state里的ISceneWorld
	public function setSenceWorld(senceWorld:ISenceWorld):void{
		for each(var fsm:FSM in dict_fsm){
			fsm.setSenceWorld(senceWorld);
		}
	}
	//当Entity被添加到世界后，被world调用，传入
	public function setSpacialManager(spacialManager:SpacialManager):void{
		for each(var fsm:FSM in dict_fsm){
			fsm.setSpacialManager(spacialManager);
		}
	}
	//==================操作FSMS=================
	//子类如果需要fsm通知guActor,可以覆写此函数
	//注意，添加时fsm需要向Entity注册监听事件
	public function addFSM(fsm:FSM):FSM{
		if(dict_fsm[fsm.getID()]!=null){
			throw new Error("已含有此fsm");
		}
		dict_fsm[fsm.getID()]=fsm;
		return fsm;
		//这个在各个Entity里设置
//		fsm.addEventListener(FSMEvent.TYPE, onFSMEvent);
//		fsm.addEventListener(SendCommandEvent.TYPE, onSendCommandEvent);
//		
//		//暂存一下，方便以后传递到State中去
//		fsm.setVO(this.vo);
//		fsm.setHardVO(this.hard);
	}

	//从没用到过
//	public function removeFSM(fsmID:int):void{
//		delete dict_fsm[fsmID];
//	}
	
	public function findFSM(fsmID:int):FSM{
		return dict_fsm[fsmID];
	}
	
	//切换某个fsm到特定状态
	public function SwitchFSMState(fsmID:int,stateID:int,data:Object=null):void{
		var fsm:FSM=findFSM(fsmID);
		if(fsm!=null){
			fsm.SwitchState(stateID,data);
		}
	}
}//end of class
}
